// 黑马的封装方法
import axios from 'axios'
// 引入路由对象
import router from '@/router'
import Notify from '@/ui/Notify'
// import { getToken, setToken } from '@/utils/token.js'
import { setStorage, getStorage } from '@/utils/storage.js'
import { refToken } from '@/api/index.js'
const http = axios.create({
  // 基准路径
  baseURL: 'http://toutiao.itheima.net',
  timeout: 5000
})

// 添加请求拦截器
http.interceptors.request.use(function (config) {
  // 加入请求头
  // ？可选量操作符,如果没有length的话就返回undefined
  // 有值的话就调用length获取长度
  // 无请求头的时候才加入token
  if (getStorage('geek-itheima')?.length > 0 && config.headers.Authorization === undefined) {
    config.headers.Authorization = `Bearer ${getStorage('geek-itheima')}`
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
http.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response
}, async function (error) {
  // 401身份过期,需要无感知刷新
  // token过期走这里
  if (error.response.status === 401) {
    // 无感知刷新token
    Notify({ type: 'warning', message: '登录过期' })
    const { data: res } = await refToken()
    setStorage('geek-itheima', res.data.token)
    console.log(getStorage('geek-itheima'))
    // 设置上新的请求头
    error.config.headers.Authorization = `Bearer ${getStorage('geek-itheima')}`
    // 然后再完成刚刚没有完成的请求
    return http(error.config) // 重新发起一次请求

    // 判断状态码500,路径为刷新token的接口,方法为put
    // 刷新token过期走这里
  } else if (error.response.status === 500 && error.config.url === '/v1_0/authorizations' && error.config.method === 'put') {
    // 拿到当前路由路径
    Notify({ type: 'danger', message: error.code })
    localStorage.clear()
    // 无历史记录跳转
    router.replace(`/login?path=${router.currentRoute.fullPath}`)
  }
  return Promise.reject(error)
})

// 结构赋值的方法导出
export default ({ url, method = 'GET', params = {}, data = {}, headers = {} }) => {
  return http({
    url,
    method,
    params,
    data,
    headers
  })
}
